package demo

import (
	"context"
	"fmt"
	"local/service_manager"
	"net/http"

	"github.com/gin-gonic/gin"
)

// DemoService 定义示例服务结构
type DemoService struct {
	name        string
	description string
	server      *http.Server
	lastError   *service_manager.ServiceError
}

// NewDemoService 创建新的示例服务
func NewService() *DemoService {
	return &DemoService{
		name:        "demo_service",
		description: "示例服务 - HTTP API示例",
	}
}

// GetName 获取服务名称
func (s *DemoService) GetName() string {
	return s.name
}

// GetDescription 获取服务描述
func (s *DemoService) GetDescription() string {
	return s.description
}

// GetDependencies 获取服务依赖
func (s *DemoService) GetDependencies() []string {
	// Demo服务没有依赖
	return nil
}

// GetLastError 获取最后一次错误
func (s *DemoService) GetLastError() *service_manager.ServiceError {
	return s.lastError
}

// OnStart 服务启动前的初始化
func (s *DemoService) OnStart(ctx context.Context) error {
	// 初始化路由
	r := gin.Default()
	api := r.Group("/api")
	{
		api.GET("/status", func(c *gin.Context) {
			c.JSON(200, gin.H{
				"status":  "running",
				"service": s.name,
			})
		})

		api.GET("/hello", func(c *gin.Context) {
			c.JSON(200, gin.H{
				"message": "Hello from Demo Service!",
			})
		})
	}

	s.server = &http.Server{
		Addr:    fmt.Sprintf(":%d", 8012),
		Handler: r,
	}

	return nil
}

// Entry 服务入口函数
func (s *DemoService) Entry(ctx context.Context) error {
	// 在goroutine中启动HTTP服务器
	errChan := make(chan error, 1)
	go func() {
		if err := s.server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			errChan <- fmt.Errorf("HTTP服务器错误: %v", err)
		}
		close(errChan)
	}()

	// 等待上下文取消或服务器错误
	select {
	case <-ctx.Done():
		return nil
	case err := <-errChan:
		if err != nil {
			s.lastError = &service_manager.ServiceError{
				Message: "服务运行失败",
				Details: err.Error(),
			}
			return err
		}
		return nil
	}
}

// OnStop 服务停止前的清理
func (s *DemoService) OnStop(ctx context.Context) error {
	if s.server != nil {
		// 优雅关闭HTTP服务器
		if err := s.server.Shutdown(ctx); err != nil {
			return fmt.Errorf("关闭HTTP服务器失败: %v", err)
		}
	}
	return nil
}
